package com.study.study;

import java.util.concurrent.TimeUnit;

/**
 * @author study
 * @version 1.0
 * @date 2020/9/13 23:21
 */
class Phone {
    public static synchronized void sendEmail() throws Exception {
        TimeUnit.SECONDS.sleep(4);
        System.out.println("发送email");
    }

    public static synchronized void sendSMS() throws Exception {
        System.out.println("发送sendSMS");
    }

    public void sayHello() {
        System.out.println("hello");
    }
}

/**
 * 8 lock
 * 1.标准访问，先打印哪个<br/>
 * 2 暂停4秒在邮件，先打印哪个/？<br/>
 * 3 新增普通方法，先打印哪个？<br/> |普通方法和同步锁无关
 * 4 2部手机，先打印哪个，<br/>| 两个对象不是同一个锁，
 * 5 两个静态同步方法，同一部手机，先打印哪个
 * 6 两个静态同步方法，2部手机，先打印哪个
 * 7 同一部手机，一个静态一个同步，先打印哪个
 * 8 2部手机，一个静态一个同步，先打印哪个
 */
//以下是上述答案

/**
 * 1 2 一个对象里面如果有多个syn方法，某一时刻内，只要一个线程去调用其中的synchronized方法，
 * 其他的线程只能等待，换而言之，某一时刻，只能有唯一一个线程去访问这些synchronized方法。
 * <p>
 * 锁的是当前对象this.被锁定后，其他的线程不能进去当前对象的其他synchronized方法、
 * <p>
 * synchronized 实现同步的基础：Java中的每一个对象都可以作为锁，具体有3种形式
 * 1 对应普通同步方法，锁当前实例对象，锁的是当前对象this
 * 2 对于同步方法块，锁是synchronized括号配置的对象
 * 对于静态同步方法，锁是当前类Class对象
 */
public class Lock8Demo05 {

    public static void main(String[] args) {

        Phone phone = new Phone();
        Phone phone2 = new Phone();
        new Thread(() -> {
            try {
                phone.sendEmail();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "A").start();
        new Thread(() -> {
            try {
                phone.sendSMS();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "B").start();

    }

}
